package cn.lg.soar.common.util.reflect;

import java.lang.reflect.Member;
import java.lang.reflect.Modifier;

/**
 * 判断修饰符的工具
 * @author luguoxiang
 * @date 2022/2/20
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public class ModifierUtils {

    /**
     * 是否 abstract 修饰
     * @param member
     * @return
     */
    public static boolean isAbstract(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isAbstract(
                member.getModifiers()
        );
    }

    /**
     * 是否 final 修饰
     * @param member
     * @return
     */
    public static boolean isFinal(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isFinal(
                member.getModifiers()
        );
    }

    /**
     * 是否 native 修饰
     * @param member
     * @return
     */
    public static boolean isNative(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isNative(
                member.getModifiers()
        );
    }

    /**
     * 是否 private 修饰
     * @param member
     * @return
     */
    public static boolean isPrivate(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isPrivate(
                member.getModifiers()
        );
    }

    /**
     * 是否 protected 修饰
     * @param member
     * @return
     */
    public static boolean isProtected(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isProtected(
                member.getModifiers()
        );
    }

    /**
     * 是否 public 修饰
     * @param member
     * @return
     */
    public static boolean isPublic(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isPublic(
                member.getModifiers()
        );
    }

    /**
     * 是否 static 修饰
     * @param member
     * @return
     */
    public static boolean isStatic(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isStatic(
                member.getModifiers()
        );
    }

    /**
     * 是否 strict 修饰
     * @param member
     * @return
     */
    public static boolean isStrict(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isStrict(
                member.getModifiers()
        );
    }

    /**
     * 是否 synchronized 修饰
     * @param member
     * @return
     */
    public static boolean isSynchronized(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isSynchronized(
                member.getModifiers()
        );
    }

    /**
     * 是否 transient 修饰
     * @param member
     * @return
     */
    public static boolean isTransient(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isTransient(
                member.getModifiers()
        );
    }

    /**
     * 是否 volatile 修饰
     * @param member
     * @return
     */
    public static boolean isVolatile(Member member) {
        if (member == null) {
            return false;
        }
        return Modifier.isVolatile(
                member.getModifiers()
        );
    }

    /**
     * 是否 abstract 修饰
     * @param clazz
     * @return
     */
    public static boolean isAbstract(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isAbstract(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 final 修饰
     * @param clazz
     * @return
     */
    public static boolean isFinal(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isFinal(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 native 修饰
     * @param clazz
     * @return
     */
    public static boolean isNative(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isNative(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 private 修饰
     * @param clazz
     * @return
     */
    public static boolean isPrivate(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isPrivate(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 protected 修饰
     * @param clazz
     * @return
     */
    public static boolean isProtected(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isProtected(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 public 修饰
     * @param clazz
     * @return
     */
    public static boolean isPublic(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isPublic(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 static 修饰
     * @param clazz
     * @return
     */
    public static boolean isStatic(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isStatic(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 strict 修饰
     * @param clazz
     * @return
     */
    public static boolean isStrict(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isStrict(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 synchronized 修饰
     * @param clazz
     * @return
     */
    public static boolean isSynchronized(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isSynchronized(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 transient 修饰
     * @param clazz
     * @return
     */
    public static boolean isTransient(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isTransient(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 volatile 修饰
     * @param clazz
     * @return
     */
    public static boolean isVolatile(Class<?> clazz) {
        if (clazz == null) {
            return false;
        }
        return Modifier.isVolatile(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 abstract 修饰
     * @param instance
     * @return
     */
    public static boolean isAbstract(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isAbstract(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 final 修饰
     * @param instance
     * @return
     */
    public static boolean isFinal(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isFinal(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 native 修饰
     * @param instance
     * @return
     */
    public static boolean isNative(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isNative(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 private 修饰
     * @param instance
     * @return
     */
    public static boolean isPrivate(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isPrivate(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 protected 修饰
     * @param instance
     * @return
     */
    public static boolean isProtected(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isProtected(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 public 修饰
     * @param instance
     * @return
     */
    public static boolean isPublic(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isPublic(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 static 修饰
     * @param instance
     * @return
     */
    public static boolean isStatic(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isStatic(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 strict 修饰
     * @param instance
     * @return
     */
    public static boolean isStrict(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isStrict(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 synchronized 修饰
     * @param instance
     * @return
     */
    public static boolean isSynchronized(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isSynchronized(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 transient 修饰
     * @param instance
     * @return
     */
    public static boolean isTransient(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isTransient(
                clazz.getModifiers()
        );
    }

    /**
     * 是否 volatile 修饰
     * @param instance
     * @return
     */
    public static boolean isVolatile(Object instance) {
        if (instance == null) {
            return false;
        }
        Class<?> clazz = instance.getClass();
        return Modifier.isVolatile(
                clazz.getModifiers()
        );
    }

}
